// This is a TextMate grammar distributed by `starry-night`.
// This grammar is licensed permissive.
// See <https://github.com/wooorm/starry-night> for more info.
/**
 * @import {Grammar} from '@wooorm/starry-night'
 */

/** @type {Grammar} */
const grammar = {
  extensions: ['.po', '.pot'],
  names: ['gettext-catalog', 'pot'],
  patterns: [
    {
      begin: '^(?=(msgid(_plural)?|msgctxt)\\s*"[^"])|^\\s*$',
      end: '\\z',
      patterns: [{include: '#body'}]
    },
    {include: '#comments'},
    {match: '^msg(id|str)\\s+""\\s*$\\n?', name: 'comment.line.number-sign.po'},
    {
      captures: {
        1: {name: 'constant.language.po'},
        2: {name: 'punctuation.separator.key-value.po'},
        3: {name: 'string.other.po'}
      },
      match: '^"(?:([^\\s:]+)(:)\\s+)?([^"]*)"\\s*$\\n?',
      name: 'meta.header.po'
    }
  ],
  repository: {
    body: {
      patterns: [
        {
          begin: '^(msgid(_plural)?)\\s+',
          beginCaptures: {1: {name: 'keyword.control.msgid.po'}},
          end: '^(?!")',
          name: 'meta.scope.msgid.po',
          patterns: [
            {
              begin: '(\\G|^)"',
              end: '"',
              name: 'string.quoted.double.po',
              patterns: [
                {match: '\\\\[\\\\"]', name: 'constant.character.escape.po'}
              ]
            }
          ]
        },
        {
          begin: '^(msgstr)(?:(\\[)(\\d+)(\\]))?\\s+',
          beginCaptures: {
            1: {name: 'keyword.control.msgstr.po'},
            2: {name: 'keyword.control.msgstr.po'},
            3: {name: 'constant.numeric.po'},
            4: {name: 'keyword.control.msgstr.po'}
          },
          end: '^(?!")',
          name: 'meta.scope.msgstr.po',
          patterns: [
            {
              begin: '(\\G|^)"',
              end: '"',
              name: 'string.quoted.double.po',
              patterns: [
                {match: '\\\\[\\\\"]', name: 'constant.character.escape.po'}
              ]
            }
          ]
        },
        {
          begin: '^(msgctxt)(?:(\\[)(\\d+)(\\]))?\\s+',
          beginCaptures: {
            1: {name: 'keyword.control.msgctxt.po'},
            2: {name: 'keyword.control.msgctxt.po'},
            3: {name: 'constant.numeric.po'},
            4: {name: 'keyword.control.msgctxt.po'}
          },
          end: '^(?!")',
          name: 'meta.scope.msgctxt.po',
          patterns: [
            {
              begin: '(\\G|^)"',
              end: '"',
              name: 'string.quoted.double.po',
              patterns: [
                {match: '\\\\[\\\\"]', name: 'constant.character.escape.po'}
              ]
            }
          ]
        },
        {
          captures: {1: {name: 'punctuation.definition.comment.po'}},
          match: '^(#~).*$\\n?',
          name: 'comment.line.number-sign.obsolete.po'
        },
        {include: '#comments'},
        {match: '^(?!\\s*$)[^#"].*$\\n?', name: 'invalid.illegal.po'}
      ]
    },
    comments: {
      patterns: [
        {
          begin: '^(?=#)',
          end: '(?!\\G)',
          patterns: [
            {
              begin: '(#,)\\s+',
              beginCaptures: {1: {name: 'punctuation.definition.comment.po'}},
              end: '\\n',
              name: 'comment.line.number-sign.flag.po',
              patterns: [
                {
                  captures: {1: {name: 'entity.name.type.flag.po'}},
                  match:
                    '(?:\\G|,\\s*)((?:fuzzy)|(?:no-)?(?:c|objc|sh|lisp|elisp|librep|scheme|smalltalk|java|csharp|awk|object-pascal|ycp|tcl|perl|perl-brace|php|gcc-internal|qt|boost)-format)'
                }
              ]
            },
            {
              begin: '#\\.',
              beginCaptures: {0: {name: 'punctuation.definition.comment.po'}},
              end: '\\n',
              name: 'comment.line.number-sign.extracted.po'
            },
            {
              begin: '(#:)[ \\t]*',
              beginCaptures: {1: {name: 'punctuation.definition.comment.po'}},
              end: '\\n',
              name: 'comment.line.number-sign.reference.po',
              patterns: [
                {match: '(\\S+:)([\\d;]*)', name: 'storage.type.class.po'}
              ]
            },
            {
              begin: '#\\|',
              beginCaptures: {0: {name: 'punctuation.definition.comment.po'}},
              end: '\\n',
              name: 'comment.line.number-sign.previous.po'
            },
            {
              begin: '#',
              beginCaptures: {0: {name: 'punctuation.definition.comment.po'}},
              end: '\\n',
              name: 'comment.line.number-sign.po'
            }
          ]
        }
      ]
    }
  },
  scopeName: 'source.po'
}

export default grammar
